package model;


import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

/**
 * Интерфейс отображения объекта в колонку таблицы.
 * 
 * @author aemaeth
 * 
 * @param <V>
 *            тип объкекта
 */
public interface SingleMapper<V> {
	/**
	 * Отформатировать объект возвращённый {@link #getValue(V) getValue} для
	 * отображения в таблице.
	 * 
	 * @param l
	 *            объект
	 * @return строка для ячейки
	 */
	String format(Object o);

	/**
	 * Получить заголовок колонки.
	 * 
	 * @return заголовок
	 */
	String columnName();

	/**
	 * Получить тип объектов, предоставляемых 
	 * функцией {@link #getValue(V) getValue}.
	 * 
	 * @return Класс объектов.
	 */
	Class<?> getColumnClass();

	/**
	 * Отредактировать объект {@code l} установив в связанном поле значение
	 * {@code valObj}.
	 * 
	 * @param l
	 *            объект из списка
	 * @param valObj
	 *            новое значение связанного поля
	 */
	void setValue(V l, Object valObj);

	/**
	 * Получить значение связанного поля для передачи его редактору.
	 * 
	 * @param l
	 *            объект из списка
	 * @return занчение связанного поля
	 */
	Object getValue(V l);

	/**
	 * Разрешено/запрещено редавтирование данной ячейки.
	 * 
	 * @param l
	 *            объект из списка
	 * @return истина, если в данной строке этой колонки можно отредактировать
	 *         значение.
	 */
	boolean isCellEditable(V l);

	/**
	 * Начальная ширина колонки.
	 * 
	 * @return ширина
	 */
	int getWidth();

	/**
	 * Редактор для ячеек этой колонки.
	 * 
	 * @return объект редактора, или {@code null} если его нет.
	 */
	TableCellEditor getEditor();

	/**
	 * Рендерер для ячеек этой колонки.
	 * 
	 * @return объект рендерера или {@code null} для дефолтного ренедереа.
	 */
	TableCellRenderer getCellRenderer();
}
